"""
主测试运行器 - 运行所有模块测试

这个脚本将依次运行所有解耦模块的测试：
1. P1模块测试 (事件驱动强化、分布式追踪、状态管理抽象)
2. P2模块测试 (容错降级、安全加固、灰度发布)
3. 生成详细的测试报告
"""

import asyncio
import logging
import sys
import time
from datetime import datetime, timezone
from pathlib import Path

# 添加项目路径
sys.path.append('/home/ubuntu/PhotoEnhanceAI-web')
sys.path.append('/home/ubuntu/PhotoEnhanceAI-web/hai-optimization/tests')

from test_runner import tester
from test_p1_modules import run_p1_tests
from test_p2_modules import run_p2_tests

# 配置日志
logging.basicConfig(
    level=logging.INFO,
    format='%(asctime)s - %(name)s - %(levelname)s - %(message)s',
    handlers=[
        logging.StreamHandler(),
        logging.FileHandler('all_tests_results.log')
    ]
)
logger = logging.getLogger(__name__)


async def main():
    """主测试函数"""
    start_time = time.time()
    
    print("🧪 开始运行所有模块测试...")
    print("="*80)
    print(f"测试开始时间: {datetime.now(timezone.utc).strftime('%Y-%m-%d %H:%M:%S UTC')}")
    print("="*80)
    
    try:
        # 运行P1模块测试
        print("\n📋 第一阶段: P1模块测试 (事件驱动强化、分布式追踪、状态管理抽象)")
        print("-" * 80)
        await run_p1_tests()
        
        # 运行P2模块测试
        print("\n📋 第二阶段: P2模块测试 (容错降级、安全加固、灰度发布)")
        print("-" * 80)
        await run_p2_tests()
        
        # 生成测试报告
        print("\n📊 生成测试报告...")
        print("-" * 80)
        
        # 保存详细报告
        report_filename = f"test_report_{datetime.now().strftime('%Y%m%d_%H%M%S')}.json"
        tester.save_report(report_filename)
        
        # 打印摘要
        tester.print_summary()
        
        # 计算总耗时
        total_duration = time.time() - start_time
        print(f"\n⏱️  总测试耗时: {total_duration:.3f}秒")
        
        # 生成测试总结
        report = tester.generate_report()
        summary = report["summary"]
        
        print("\n🎯 测试总结:")
        print("="*80)
        
        if summary["overall_success"]:
            print("✅ 所有测试通过！系统模块运行正常。")
        else:
            print("❌ 部分测试失败，请检查失败的模块。")
        
        print(f"📈 测试统计:")
        print(f"   • 测试模块数: {summary['total_modules']}")
        print(f"   • 测试用例数: {summary['total_tests']}")
        print(f"   • 通过率: {summary['success_rate']:.1f}%")
        print(f"   • 失败数: {summary['failed_tests']}")
        
        # 显示失败的测试
        if summary["failed_tests"] > 0:
            print(f"\n❌ 失败的测试:")
            for result in tester.test_results:
                if not result.success:
                    print(f"   • {result.module_name}.{result.test_name}: {result.error_message}")
        
        # 显示模块详情
        print(f"\n📋 模块详情:")
        for module_name, module_info in report["modules"].items():
            status_icon = "✅" if module_info["overall_success"] else "❌"
            print(f"   {status_icon} {module_name}: {module_info['passed_tests']}/{module_info['total_tests']} "
                  f"({module_info['success_rate']:.1f}%)")
        
        print("="*80)
        print(f"测试完成时间: {datetime.now(timezone.utc).strftime('%Y-%m-%d %H:%M:%S UTC')}")
        print(f"详细报告已保存: {report_filename}")
        print("="*80)
        
        # 返回适当的退出码
        return 0 if summary["overall_success"] else 1
        
    except Exception as e:
        logger.error(f"测试运行过程中出现错误: {e}")
        print(f"\n💥 测试运行失败: {e}")
        return 1


if __name__ == "__main__":
    exit_code = asyncio.run(main())
    sys.exit(exit_code)
